package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;

import co.gov.medellin.ssti.sub.model.dao.VflexDAO;
import co.gov.medellin.ssti.sub.model.vo.ValorFlexibleVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;

public class VflexDAOImpl2 extends NamedParameterJdbcDaoSupport implements
		VflexDAO {

	public Collection<VflexVO> findVflex(String nombreTipoVflex) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT VFLEX.CODIGO CODE, VFLEX.CODIGO_VALOR CODIGO_VALOR, "
						+ " VFLEX.NOMBRE NOMBRE_VALOR, VFLEX.DESCRIPCION DESC_VALOR, "
						+ " TVFLEX.CODIGO CODE_TIPO_VFLEX, TVFLEX.NOMBRE NOMBRE_TIPO_VFLEX "
						+ " FROM paoyer.TCS_VALOR_FLEXIBLE VFLEX, paoyer.TCS_TIPO_VALOR_FLEX TVFLEX "
						+ " WHERE TVFLEX.CODIGO = VFLEX.TVF_CODIGO ");
		if (nombreTipoVflex != null) {
			query.append(" AND TVFLEX.NOMBRE LIKE UPPER(:NOMBRE) "
					+ " ORDER BY vflex.descripcion ");

			namedParameters.put("NOMBRE", nombreTipoVflex);

			List<VflexVO> vflex = getNamedParameterJdbcTemplate().query(
					query.toString(), namedParameters,
					new RowMapper<VflexVO>() {

						public VflexVO mapRow(ResultSet rst, int rowNum)
								throws SQLException {
							VflexVO vo = new VflexVO();
							vo.setCode(new Long(rst.getLong("CODE")));
							vo.setCodigoVflex(rst.getString("CODIGO_VALOR"));
							vo.setNombreVflex(rst.getString("CODE") + "~"
									+ rst.getString("DESC_VALOR"));
							vo.setDescVflex(rst.getString("DESC_VALOR"));
							vo.setCodigoTipoVflex(new Long(rst
									.getLong("CODE_TIPO_VFLEX")));
							vo.setNombreTipoVflex(rst
									.getString("NOMBRE_TIPO_VFLEX"));
							return vo;
						}
					});

			return vflex;
		} else {
			return null;
		}
	}

	public Collection<VflexVO> findVflex(String nombreTipoVflex,
			String codePadre) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT VFLEX.CODIGO CODE, VFLEX.CODIGO_VALOR CODIGO_VALOR, "
						+ "VFLEX.NOMBRE NOMBRE_VALOR, VFLEX.DESCRIPCION DESC_VALOR, "
						+ "TVFLEX.CODIGO CODE_TIPO_VFLEX, TVFLEX.NOMBRE NOMBRE_TIPO_VFLEX "
						+ "FROM paoyer.TCS_VALOR_FLEXIBLE VFLEX, paoyer.TCS_TIPO_VALOR_FLEX TVFLEX, paoyer.TCS_VALOR_FLEXIBLE VFLEXPADRE "
						+ "WHERE TVFLEX.CODIGO = VFLEX.TVF_CODIGO "
						+ "AND VFLEX.CAMPO_N1 = VFLEXPADRE.CODIGO ");

		if (nombreTipoVflex != null && codePadre != null) {
			if (codePadre.equals("18343")) {
				query.append(" AND VFLEX.CAMPO_N1 = :CAMPO_N1 ");
				namedParameters.put("CAMPO_N1", codePadre);
			} else {
				query.append(" AND TVFLEX.NOMBRE LIKE :NOMBRE "
						+ " AND VFLEX.CAMPO_N1 = :CAMPO_N1 ");
				namedParameters.put("NOMBRE", nombreTipoVflex);
				namedParameters.put("CAMPO_N1", codePadre);
			}
			query.append(" ORDER BY vflex.descripcion ");

			System.out.println(query);
			System.out.println(namedParameters.toString());

			List<VflexVO> vflex = getNamedParameterJdbcTemplate().query(
					query.toString(), namedParameters,
					new RowMapper<VflexVO>() {

						public VflexVO mapRow(ResultSet rs, int rowNum)
								throws SQLException {
							VflexVO vo = new VflexVO();
							vo.setCode(new Long(rs.getLong("CODE")));
							vo.setCodigoVflex(rs.getString("CODIGO_VALOR"));
							vo.setNombreVflex(rs.getString("NOMBRE_VALOR"));
							vo.setDescVflex(rs.getString("DESC_VALOR"));
							vo.setCodigoTipoVflex(new Long(rs
									.getLong("CODE_TIPO_VFLEX")));
							vo.setNombreTipoVflex(rs
									.getString("NOMBRE_TIPO_VFLEX"));
							return vo;
						}
					});

			return vflex;
		} else
			return null;
	}

	public Collection<VflexVO> findVflex(String nombreTipoVflex, int origen) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT VFLEX.CODIGO CODE, VFLEX.CODIGO_VALOR CODIGO_VALOR, "
						+ "VFLEX.NOMBRE NOMBRE_VALOR, VFLEX.DESCRIPCION DESC_VALOR, "
						+ "TVFLEX.CODIGO CODE_TIPO_VFLEX, TVFLEX.NOMBRE NOMBRE_TIPO_VFLEX "
						+ "FROM paoyer.TCS_VALOR_FLEXIBLE VFLEX, paoyer.TCS_TIPO_VALOR_FLEX TVFLEX "
						+ "WHERE TVFLEX.CODIGO = VFLEX.TVF_CODIGO ");

		if (nombreTipoVflex != null) {
			query.append("AND TVFLEX.NOMBRE = :TVFLEX.NOMBRE ");
			query.append(" order by vflex.descripcion ");

			namedParameters.put("TVFLEX.NOMBRE", nombreTipoVflex);

			System.out.println(query.toString());
			System.out.println(namedParameters.get("TVFLEX.NOMBRE"));

			List<VflexVO> vflex = getNamedParameterJdbcTemplate().query(
					query.toString(), namedParameters,
					new RowMapper<VflexVO>() {

						public VflexVO mapRow(ResultSet rst, int rowNum)
								throws SQLException {
							VflexVO vo = new VflexVO();
							vo = new VflexVO();
							vo.setCode(new Long(rst.getLong("CODE")));
							vo.setCodigoVflex(rst.getString("CODIGO_VALOR"));
							vo.setNombreVflex(rst.getString("NOMBRE_VALOR"));
							vo.setDescVflex(rst.getString("DESC_VALOR"));
							vo.setCodigoTipoVflex(new Long(rst
									.getLong("CODE_TIPO_VFLEX")));
							vo.setNombreTipoVflex(rst
									.getString("NOMBRE_TIPO_VFLEX"));
							return vo;
						}
					});
			return vflex;
		} else
			return null;
	}

	public Collection<VflexVO> findCodeValorFlex(String strNombre) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT NOMBRE, DESCRIPCION, CODIGO FROM paoyer.TCS_VALOR_FLEXIBLE ");

		if (strNombre != null && !strNombre.equals("")) {
			query.append("WHERE DESCRIPCION LIKE :DESCRIPCION ");

			namedParameters.put("DESCRIPCION", strNombre.trim());

			List<VflexVO> vflex = getNamedParameterJdbcTemplate().query(
					query.toString(), namedParameters,
					new RowMapper<VflexVO>() {

						public VflexVO mapRow(ResultSet rs, int rowNum)
								throws SQLException {
							VflexVO vo = new VflexVO();
							vo.setCode(new Long(rs.getLong("CODIGO")));
							vo.setNombreVflex(rs.getString("NOMBRE"));
							vo.setDescVflex(rs.getString("DESCRIPCION"));
							return vo;
						}
					});
			return vflex;
		} else {
			return null;
		}
	}

	public Long findCodePadreByCodeHijo(Long codeHijo) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT codigo FROM paoyer.tcs_valor_flexible "
				+ " WHERE codigo = "
				+ " ( SELECT campo_n1 FROM paoyer.tcs_valor_flexible WHERE codigo = :codigo )";

		namedParameters.put("codigo", codeHijo);
		try {
			Long codigo = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, Long.class);
			return codigo;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: throw?
			return null;
		}
	}

	public boolean exists(String strNombre, String strCodigo) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT DESCRIPCION FROM paoyer.TCS_VALOR_FLEXIBLE "
				+ " WHERE UPPER(DESCRIPCION) LIKE :DESCRIPCION "
				+ " AND UPPER(CODIGO_VALOR) LIKE :CODIGO_VALOR ";

		namedParameters.put("DESCRIPCION", strNombre.trim().toUpperCase());
		namedParameters.put("CODIGO_VALOR", strCodigo.trim().toUpperCase());

		try {
			String descripcion = getNamedParameterJdbcTemplate()
					.queryForObject(query, namedParameters, String.class);
			if (descripcion != null) {
				return true;
			}
			return false;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			return false;
		}
	}

	public Collection<ValorFlexibleVO> findDominio(String tipovfl, String option) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int dominio = Integer.parseInt(tipovfl.trim());

		StringBuffer query = new StringBuffer(
				"SELECT TCS_VALOR_FLEXIBLE.CODIGO CODIGOVFL, TCS_TIPO_VALOR_FLEX.CODIGO TVFCOD, "
						+ "TCS_TIPO_VALOR_FLEX.DESCRIPCION TVFDES, TCS_TIPO_VALOR_FLEX.VIGENCIA TVFVIG, "
						+ "TCS_VALOR_FLEXIBLE.DESCRIPCION VFDES, TCS_VALOR_FLEXIBLE.TVF_CODIGO VFTVFCOD "
						+ "FROM paoyer.TCS_TIPO_VALOR_FLEX, paoyer.TCS_VALOR_FLEXIBLE "
						+ "WHERE TCS_TIPO_VALOR_FLEX.CODIGO = :CODIGO AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = :CODIGO ");

		if (option.equals("1")) {
			query.append(" AND TCS_VALOR_FLEXIBLE.VIGENCIA='S'");
		} else {
			query.append(" AND TCS_VALOR_FLEXIBLE.VIGENCIA='N'");
		}
		query.append(" ORDER BY CODIGOVFL");

		namedParameters.put("CODIGO", dominio);

		List<ValorFlexibleVO> listaDominio = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<ValorFlexibleVO>() {

							public ValorFlexibleVO mapRow(ResultSet rs,
									int rowNum) throws SQLException {
								ValorFlexibleVO vo = new ValorFlexibleVO();
								vo.setCodigotvfl(rs.getString("TVFCOD"));
								vo.settVFCodigo(rs.getString("VFTVFCOD"));
								vo.setDescripciontvfl(rs.getString("TVFDES"));
								vo.setDescripcionvf(rs.getString("VFDES"));
								vo.setVigenciatvfl(rs.getString("TVFVIG"));
								vo.setCodigovfl(rs.getString("CODIGOVFL"));
								return vo;
							}
						});

		return listaDominio;
	}

	public int actValorFlex(String strCodVFL) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iCodvfl = Integer.parseInt(strCodVFL.trim());
		String query = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ "VIGENCIA = 'S' WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", iCodvfl);
		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	@Override
	public Collection<VflexVO> findByTVFCodigo(String tvfCodigo) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		StringBuffer query = new StringBuffer();
		query.append(" SELECT CODIGO, CODIGO_VALOR, NOMBRE, DESCRIPCION ");
		query.append(" FROM PAOYER.TCS_VALOR_FLEXIBLE ");
		query.append(" WHERE TVF_CODIGO = :TVF_CODIGO ");

		namedParameters.put("TVF_CODIGO", tvfCodigo);
		System.out.println(query.toString());
		System.out.println(namedParameters.toString());
		List<VflexVO> lista = getNamedParameterJdbcTemplate().query(
				query.toString(), namedParameters, new RowMapper<VflexVO>() {

					public VflexVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						VflexVO vo = new VflexVO();
						vo.setCode(rs.getLong("CODIGO"));
						vo.setCodigoValor(rs.getString("CODIGO_VALOR"));
						vo.setNombreVflex(rs.getString("NOMBRE"));
						vo.setDescVflex(rs.getString("DESCRIPCION"));
						return vo;
					}
				});
		return lista;
	}

}
